#ifndef __S5P4418GPIO_H_
#define __S5P4418GPIO_H_

#include "PUBLIC/public.h"

#define GPIO_ADDR       0xC0010000
#define UART_ADDR       0xC00A0000
#define TIMER_ADDR      0xC0017000
#define PWM_ADDR        0xC0018000

#define GPIOAOUT        __REG(GPIO_ADDR + 0xA000)   /* 定义IO口输出方式，1 = High Level */
#define GPIOAOUTENB     __REG(GPIO_ADDR + 0xA004)   /* 0 = Input; 1 =Output */
#define GPIOADETMODE0   __REG(GPIO_ADDR + 0xA008)
#define GPIOADETMODE1   __REG(GPIO_ADDR + 0xA00C)
#define GPIOAINTENB     __REG(GPIO_ADDR + 0xA010)   /* 中断使能 */
#define GPIOADET        __REG(GPIO_ADDR + 0xA014)   /* 中断检测与清除 */
#define GPIOADETMODEEX  __REG(GPIO_ADDR + 0xA028)   /* 中断触发方式 b'000' */
#define GPIOAPAD        __REG(GPIO_ADDR + 0xA018)   /* IO口电平状态 */
#define GPIOAALTFN0     __REG(GPIO_ADDR + 0xA020)   /* 复用 */
#define GPIOAALTFN1     __REG(GPIO_ADDR + 0xA024)
#define GPIOADETENB     __REG(GPIO_ADDR + 0xA03C)   /* Event Detect Enable */

#define GPIOBOUT        __REG(GPIO_ADDR + 0xB000)   /* 定义IO口输出方式，1 = High Level */
#define GPIOBOUTENB     __REG(GPIO_ADDR + 0xB004)   /* 0 = Input; 1 =Output */
#define GPIOBDETMODE0   __REG(GPIO_ADDR + 0xB008)
#define GPIOBDETMODE1   __REG(GPIO_ADDR + 0xB00C)
#define GPIOBINTENB     __REG(GPIO_ADDR + 0xB010)   /* 中断使能 */
#define GPIOBDET        __REG(GPIO_ADDR + 0xB014)   /* 中断检测与清除 */
#define GPIOBDETMODEEX  __REG(GPIO_ADDR + 0xB028)   /* 中断触发方式 b'000' */
#define GPIOBPAD        __REG(GPIO_ADDR + 0xB018)   /* IO口电平状态 */
#define GPIOBALTFN0     __REG(GPIO_ADDR + 0xB020)   /* 复用 */
#define GPIOBALTFN1     __REG(GPIO_ADDR + 0xB024)
#define GPIOBDETENB     __REG(GPIO_ADDR + 0xB03C)   /* Event Detect Enable */

#define GPIODOUT        __REG(GPIO_ADDR + 0xD000)
#define GPIODOUTENB     __REG(GPIO_ADDR + 0xD004)
#define GPIODPAD        __REG(GPIO_ADDR + 0xD018)
#define GPIODALTFN0     __REG(GPIO_ADDR + 0xD020)
#define GPIODALTFN1     __REG(GPIO_ADDR + 0xD024)

#define UART0_ADDR      (UART_ADDR + 0x1000)
#define UARTDR          (*(volatile u8 *)(UART0_ADDR + 0x0000))
#define UARTFR          __REG(UART0_ADDR + 0x0018)
#define UARTIBRD        __REG(UART0_ADDR + 0x0024)
#define UARTFBRD        __REG(UART0_ADDR + 0x0028)
#define UARTLCR_H       __REG(UART0_ADDR + 0x002C)
#define UARTCR          __REG(UART0_ADDR + 0x0030)
#define UARTIMSC        __REG(UART0_ADDR + 0x0038)
#define UARTICR         __REG(UART0_ADDR + 0x0044)

#define UARTCLKENB_UART0            __REG(UART_ADDR + 0x9000)   // 生成串口时钟
#define UARTCLKGEN0L_UART0          __REG(UART_ADDR + 0x9004)

#define TCFG0           __REG(TIMER_ADDR + 0x00)    /* 设置预分频 0 ~ 255 */
#define TCFG1           __REG(TIMER_ADDR + 0x04)    /* 分频 2 4 8 16 */
#define TCON            __REG(TIMER_ADDR + 0x08)    /* 重装载，翻转，手动更新，启动，死区*/
#define TCNTB0          __REG(TIMER_ADDR + 0x0C)    /* 重装载值 */
#define TCMPB0          __REG(TIMER_ADDR + 0x10)    /* 比较值 */
#define TCNTO0          __REG(TIMER_ADDR + 0x14)    /* 当前计数值 */

#define TCNTB2          __REG(TIMER_ADDR + 0x24)    /* 重装载值 */
#define TCMPB2          __REG(TIMER_ADDR + 0x28)    /* 比较值 */
#define TCNTO2          __REG(TIMER_ADDR + 0x2C)    /* 当前计数值 */

#define TINT_CSTAT                  __REG(TIMER_ADDR + 0x44)    /* 中断使能 */

#define PWMTIMERCLKENB_TIMER0       __REG(0xC00B0000 + 0x9000)  // 生成TIMER时钟
#define PWMTIMERCLKGEN0L_TIMER0     __REG(0xC00B0000 + 0x9004)

#define IP_RESET_REGISTER1          __REG(0xC0010000 + 0x2004)

#define ALIVEPWRGATEREG             __REG(0xC0010000 + 0x0800)
#define ALIVEGPIOPADOUTENBSETREG    __REG(0xC0010000 + 0x0878)
#define ALIVEGPIOPADOUTENBREADREG   __REG(0xC0010000 + 0x087C)

#endif
